// Thread.hpp
#pragma once

#include <iostream>
#include <string>
#include <ctime>
#include <pthread.h>

// #include <functional>
// using fun = std::function<void()>;
// typedef std::function<void()> fun;

template <class T>
class Thread
{
    typedef void (*callback_t)(void *);

public:
    static void *Routine(void *args)
    {
        Thread *thread = static_cast<Thread *>(args);
        thread->Entery();
        return nullptr;
    }

public:
    Thread(callback_t cb, T *parameter = nullptr)
        : _tid(0), _start_timestamp(0), _isrunning(false), _cb(cb), _parameter(parameter)
    {
    }
    void Run()
    {
        _start_timestamp = time(nullptr);
        _isrunning = true;
        pthread_create(&_tid, nullptr, Routine, this);
    }
    void Join()
    {
        pthread_join(_tid, nullptr);
        _isrunning = false;
    }
    uint64_t StartTimestamp()
    {
        return _start_timestamp;
    }
    bool IsRunning()
    {
        return _isrunning;
    }
    void Entery()
    {
        _cb(_parameter);
    }
    ~Thread()
    {
    }

private:
    pthread_t _tid;
    std::string _name;
    uint64_t _start_timestamp; // 时间戳，记录线程启动时间
    bool _isrunning;           // 线程是否是运行的

    callback_t _cb;
    T *_parameter;
};

// static int num = 1;

// class Thread
// {
//     typedef void (*callback_t)();
// public:
//     static void *Routine(void *args)
//     {
//         Thread *thread = static_cast<Thread *>(args);
//         thread->Entery();
//         return nullptr;
//     }

// public:
//     Thread(callback_t cb)
//         : _tid(0), _start_timestamp(0), _isrunning(false), _cb(cb)
//     {
//     }
//     void Run()
//     {
//         _name = "thread-" + std::to_string(num++);
//         _start_timestamp = time(nullptr);
//         _isrunning = true;
//         pthread_create(&_tid, nullptr, Routine, this);
//     }
//     void Join()
//     {
//         pthread_join(_tid, nullptr);
//         _isrunning = false;
//     }
//     std::string Name()
//     {
//         return _name;
//     }
//     uint64_t StartTimestamp()
//     {
//         return _start_timestamp;
//     }
//     bool IsRunning()
//     {
//         return _isrunning;
//     }
//     void Entery()
//     {

//             _cb();
//     }
//     ~Thread()
//     {
//     }

// private:
//     pthread_t _tid;
//     std::string _name;
//     uint64_t _start_timestamp; // 时间戳，记录线程启动时间
//     bool _isrunning;           // 线程是否是运行的

//     callback_t _cb;
// };
